lexer grammar SVLexer;

// channels 0->NORMAL 1->SPACE 2->DIRECTIVE 3->COMMENTS

EM : '!' ;
EMEQ : '!=' ;
EMEQEQ : '!==' ;
EMEQQM : '!=?' ;
DQ : '"' ;
DQDPIDQ : '"DPI"' ;
DQDPIMICDQ : '"DPI-C"' ;
HA : '#' ;
HAHA : '##' ;
HAMIHA : '#-#' ;
HAEQHA : '#=#' ;
DL : '$' ;
DLERROR : '$error' ;
DLFATAL : '$fatal' ;
DLFULLSKEW : '$fullskew' ;
DLHOLD : '$hold' ;
DLINFO : '$info' ;
DLNOCHANGE : '$nochange' ;
DLPERIOD : '$period' ;
DLRECOVERY : '$recovery' ;
DLRECREM : '$recrem' ;
DLREMOVAL : '$removal' ;
DLROOTDT : '$root.' ;
DLSETUP : '$setup' ;
DLSETUPHOLD : '$setuphold' ;
DLSKEW : '$skew' ;
DLTIMESKEW : '$timeskew' ;
DLUNIT : '$unit' ;
DLWARNING : '$warning' ;
DLWIDTH : '$width' ;
MO : '%' ;
MOEQ : '%=' ;
AM : '&' ;
AMAM : '&&' ;
AMAMAM : '&&&' ;
AMEQ : '&=' ;
AP : '\'' ;
LP : '(' ;
RP : ')' ;
AS : '*' ;
ASAS : '**' ;
ASSL : '*/' ;
ASCLCLAS : '*::*' ;
ASEQ : '*=' ;
ASGT : '*>' ;
PL : '+' ;
PLPL : '++' ;
PLCL : '+:' ;
PLEQ : '+=' ;
CO : ',' ;
MI : '-' ;
MIMI : '--' ;
MICL : '-:' ;
MIEQ : '-=' ;
MIGT : '->' ;
MIGTGT : '->>' ;
DT : '.' ;
DTAS : '.*' ;
SL : '/' ;
SLAS : '/*' ;
SLSL : '//' ;
SLEQ : '/=' ;
ONESTEP : '1step' ;
CL : ':' ;
CLSL : ':/' ;
CLCL : '::' ;
CLEQ : ':=' ;
SC : ';' ;
LT : '<' ;
LTMIGT : '<->' ;
LTLT : '<<' ;
LTLTLT : '<<<' ;
LTLTLTEQ : '<<<=' ;
LTLTEQ : '<<=' ;
LTEQ : '<=' ;
EQ : '=' ;
EQEQ : '==' ;
EQEQEQ : '===' ;
EQEQQM : '==?' ;
EQGT : '=>' ;
GT : '>' ;
GTEQ : '>=' ;
GTGT : '>>' ;
GTGTEQ : '>>=' ;
GTGTGT : '>>>' ;
GTGTGTEQ : '>>>=' ;
QM : '?' ;
AT : '@' ;
ATAT : '@@' ;
PATHPULSEDL : 'PATHPULSE$' ;
LB : '[' ;
RB : ']' ;
CA : '^' ;
CAEQ : '^=' ;
CATI : '^~' ;
ACCEPT_ON : 'accept_on' ;
ALIAS : 'alias' ;
ALWAYS : 'always' ;
ALWAYS_COMB : 'always_comb' ;
ALWAYS_FF : 'always_ff' ;
ALWAYS_LATCH : 'always_latch' ;
AND : 'and' ;
ASSERT : 'assert' ;
ASSIGN : 'assign' ;
ASSUME : 'assume' ;
AUTOMATIC : 'automatic' ;
BEFORE : 'before' ;
BEGIN : 'begin' ;
BIND : 'bind' ;
BINS : 'bins' ;
BINSOF : 'binsof' ;
BIT : 'bit' ;
BREAK : 'break' ;
BUF : 'buf' ;
BUFIFZERO : 'bufif0' ;
BUFIFONE : 'bufif1' ;
BYTE : 'byte' ;
CASE : 'case' ;
CASEX : 'casex' ;
CASEZ : 'casez' ;
CELL : 'cell' ;
CHANDLE : 'chandle' ;
CHECKER : 'checker' ;
CLASS : 'class' ;
CLOCKING : 'clocking' ;
CMOS : 'cmos' ;
CONFIG : 'config' ;
CONST : 'const' ;
CONSTRAINT : 'constraint' ;
CONTEXT : 'context' ;
CONTINUE : 'continue' ;
COVER : 'cover' ;
COVERGROUP : 'covergroup' ;
COVERPOINT : 'coverpoint' ;
CROSS : 'cross' ;
DEASSIGN : 'deassign' ;
DEFAULT : 'default' ;
DEFPARAM : 'defparam' ;
DESIGN : 'design' ;
DISABLE : 'disable' ;
DIST : 'dist' ;
DO : 'do' ;
EDGE : 'edge' ;
ELSE : 'else' ;
END : 'end' ;
ENDCASE : 'endcase' ;
ENDCHECKER : 'endchecker' ;
ENDCLASS : 'endclass' ;
ENDCLOCKING : 'endclocking' ;
ENDCONFIG : 'endconfig' ;
ENDFUNCTION : 'endfunction' ;
ENDGENERATE : 'endgenerate' ;
ENDGROUP : 'endgroup' ;
ENDINTERFACE : 'endinterface' ;
ENDMODULE : 'endmodule' ;
ENDPACKAGE : 'endpackage' ;
ENDPRIMITIVE : 'endprimitive' ;
ENDPROGRAM : 'endprogram' ;
ENDPROPERTY : 'endproperty' ;
ENDSEQUENCE : 'endsequence' ;
ENDSPECIFY : 'endspecify' ;
ENDTABLE : 'endtable' ;
ENDTASK : 'endtask' ;
ENUM : 'enum' ;
EVENT : 'event' ;
EXPECT : 'expect' ;
EXPORT : 'export' ;
EXTENDS : 'extends' ;
EXTERN : 'extern' ;
FINAL : 'final' ;
FIRST_MATCH : 'first_match' ;
FOR : 'for' ;
FORCE : 'force' ;
FOREACH : 'foreach' ;
FOREVER : 'forever' ;
FORK : 'fork' ;
FORKJOIN : 'forkjoin' ;
FUNCTION : 'function' ;
GENERATE : 'generate' ;
GENVAR : 'genvar' ;
GLOBAL : 'global' ;
HIGHZZERO : 'highz0' ;
HIGHZONE : 'highz1' ;
IF : 'if' ;
IFF : 'iff' ;
IFNONE : 'ifnone' ;
IGNORE_BINS : 'ignore_bins' ;
ILLEGAL_BINS : 'illegal_bins' ;
IMPLEMENTS : 'implements' ;
IMPLIES : 'implies' ;
IMPORT : 'import' ;
INCLUDE : 'include' ;
INITIAL : 'initial' ;
INOUT : 'inout' ;
INPUT : 'input' ;
INSIDE : 'inside' ;
INSTANCE : 'instance' ;
INT : 'int' ;
INTEGER : 'integer' ;
INTERCONNECT : 'interconnect' ;
INTERFACE : 'interface' ;
INTERSECT : 'intersect' ;
JOIN : 'join' ;
JOIN_ANY : 'join_any' ;
JOIN_NONE : 'join_none' ;
LARGE : 'large' ;
LET : 'let' ;
LIBLIST : 'liblist' ;
LIBRARY : 'library' ;
LOCAL : 'local' ;
LOCALPARAM : 'localparam' ;
LOGIC : 'logic' ;
LONGINT : 'longint' ;
MACROMODULE : 'macromodule' ;
MATCHES : 'matches' ;
MEDIUM : 'medium' ;
MODPORT : 'modport' ;
MODULE : 'module' ;
NAND : 'nand' ;
NEGEDGE : 'negedge' ;
NETTYPE : 'nettype' ;
NEW : 'new' ;
NEXTTIME : 'nexttime' ;
NMOS : 'nmos' ;
NOR : 'nor' ;
NOSHOWCANCELLED : 'noshowcancelled' ;
NOT : 'not' ;
NOTIFZERO : 'notif0' ;
NOTIFONE : 'notif1' ;
NULL : 'null' ;
OPTIONDT : 'option.' ;
OR : 'or' ;
OUTPUT : 'output' ;
PACKAGE : 'package' ;
PACKED : 'packed' ;
PARAMETER : 'parameter' ;
PMOS : 'pmos' ;
POSEDGE : 'posedge' ;
PRIMITIVE : 'primitive' ;
PRIORITY : 'priority' ;
PROGRAM : 'program' ;
PROPERTY : 'property' ;
PROTECTED : 'protected' ;
PULLZERO : 'pull0' ;
PULLONE : 'pull1' ;
PULLDOWN : 'pulldown' ;
PULLUP : 'pullup' ;
PULSESTYLE_ONDETECT : 'pulsestyle_ondetect' ;
PULSESTYLE_ONEVENT : 'pulsestyle_onevent' ;
PURE : 'pure' ;
RAND : 'rand' ;
RANDC : 'randc' ;
RANDCASE : 'randcase' ;
RANDOMIZE : 'randomize' ;
RANDSEQUENCE : 'randsequence' ;
RCMOS : 'rcmos' ;
REAL : 'real' ;
REALTIME : 'realtime' ;
REF : 'ref' ;
REG : 'reg' ;
REJECT_ON : 'reject_on' ;
RELEASE : 'release' ;
REPEAT : 'repeat' ;
RESTRICT : 'restrict' ;
RETURN : 'return' ;
RNMOS : 'rnmos' ;
RPMOS : 'rpmos' ;
RTRAN : 'rtran' ;
RTRANIFZERO : 'rtranif0' ;
RTRANIFONE : 'rtranif1' ;
S_ALWAYS : 's_always' ;
S_EVENTUALLY : 's_eventually' ;
S_NEXTTIME : 's_nexttime' ;
S_UNTIL : 's_until' ;
S_UNTIL_WITH : 's_until_with' ;
SAMPLE : 'sample' ;
SCALARED : 'scalared' ;
SEQUENCE : 'sequence' ;
SHORTINT : 'shortint' ;
SHORTREAL : 'shortreal' ;
SHOWCANCELLED : 'showcancelled' ;
SIGNED : 'signed' ;
SMALL : 'small' ;
SOFT : 'soft' ;
SOLVE : 'solve' ;
SPECIFY : 'specify' ;
SPECPARAM : 'specparam' ;
STATIC : 'static' ;
STD : 'std' ;
STRING : 'string' ;
STRONG : 'strong' ;
STRONGZERO : 'strong0' ;
STRONGONE : 'strong1' ;
STRUCT : 'struct' ;
SUPER : 'super' ;
SUPPLYZERO : 'supply0' ;
SUPPLYONE : 'supply1' ;
SYNC_ACCEPT_ON : 'sync_accept_on' ;
SYNC_REJECT_ON : 'sync_reject_on' ;
TABLE : 'table' ;
TAGGED : 'tagged' ;
TASK : 'task' ;
THIS : 'this' ;
THROUGHOUT : 'throughout' ;
TIME : 'time' ;
TIMEPRECISION : 'timeprecision' ;
TIMEUNIT : 'timeunit' ;
TRAN : 'tran' ;
TRANIFZERO : 'tranif0' ;
TRANIFONE : 'tranif1' ;
TRI : 'tri' ;
TRIZERO : 'tri0' ;
TRIONE : 'tri1' ;
TRIAND : 'triand' ;
TRIOR : 'trior' ;
TRIREG : 'trireg' ;
TYPE : 'type' ;
TYPE_OPTIONDT : 'type_option.' ;
TYPEDEF : 'typedef' ;
UNION : 'union' ;
UNIQUE : 'unique' ;
UNIQUEZERO : 'unique0' ;
UNSIGNED : 'unsigned' ;
UNTIL : 'until' ;
UNTIL_WITH : 'until_with' ;
UNTYPED : 'untyped' ;
USE : 'use' ;
UWIRE : 'uwire' ;
VAR : 'var' ;
VECTORED : 'vectored' ;
VIRTUAL : 'virtual' ;
VOID : 'void' ;
WAIT : 'wait' ;
WAIT_ORDER : 'wait_order' ;
WAND : 'wand' ;
WEAK : 'weak' ;
WEAKZERO : 'weak0' ;
WEAKONE : 'weak1' ;
WHILE : 'while' ;
WILDCARD : 'wildcard' ;
WIRE : 'wire' ;
WITH : 'with' ;
WITHIN : 'within' ;
WOR : 'wor' ;
XNOR : 'xnor' ;
XOR : 'xor' ;
LC : '{' ;
VL : '|' ;
VLMIGT : '|->' ;
VLEQ : '|=' ;
VLEQGT : '|=>' ;
VLVL : '||' ;
RC : '}' ;
TI : '~' ;
TIAM : '~&' ;
TICA : '~^' ;
TIVL : '~|' ;
TIME_LITERAL : ( UNSIGNED_NUMBER | FIXED_POINT_NUMBER ) TIME_UNIT ;
fragment TIME_UNIT : [munpf]? 's' ;
DECIMAL_NUMBER : ( SIZE? DECIMAL_BASE )? UNSIGNED_NUMBER | SIZE? DECIMAL_BASE ( X_DIGIT | Z_DIGIT ) '_'* ;
BINARY_NUMBER : SIZE? BINARY_BASE BINARY_VALUE ;
OCTAL_NUMBER : SIZE? OCTAL_BASE OCTAL_VALUE ;
HEX_NUMBER : SIZE? HEX_BASE HEX_VALUE ;
fragment SIGN : [+\-] ;
fragment SIZE : NON_ZERO_UNSIGNED_NUMBER ;
fragment NON_ZERO_UNSIGNED_NUMBER : NON_ZERO_DECIMAL_DIGIT ( '_' | DECIMAL_DIGIT )* ;
REAL_NUMBER : FIXED_POINT_NUMBER | UNSIGNED_NUMBER ( '.' UNSIGNED_NUMBER )? EXP SIGN? UNSIGNED_NUMBER ;
fragment FIXED_POINT_NUMBER : UNSIGNED_NUMBER '.' UNSIGNED_NUMBER ;
fragment EXP : [eE] ;
fragment UNSIGNED_NUMBER : DECIMAL_DIGIT ( '_' | DECIMAL_DIGIT )* ;
fragment BINARY_VALUE : BINARY_DIGIT ( '_' | BINARY_DIGIT )* ;
fragment OCTAL_VALUE : OCTAL_DIGIT ( '_' | OCTAL_DIGIT )* ;
fragment HEX_VALUE : HEX_DIGIT ( '_' | HEX_DIGIT )* ;
fragment DECIMAL_BASE : '\'' [sS]? [dD] ;
fragment BINARY_BASE : '\'' [sS]? [bB] ;
fragment OCTAL_BASE : '\'' [sS]? [oO] ;
fragment HEX_BASE : '\'' [sS]? [hH] ;
fragment NON_ZERO_DECIMAL_DIGIT : [1-9] ;
fragment DECIMAL_DIGIT : [0-9] ;
fragment BINARY_DIGIT : [01] | X_DIGIT | Z_DIGIT ;
fragment OCTAL_DIGIT : [0-7] | X_DIGIT | Z_DIGIT ;
fragment HEX_DIGIT : [0-9a-fA-F] | X_DIGIT | Z_DIGIT ;
fragment X_DIGIT : [xX] ;
fragment Z_DIGIT : [zZ?] ;
UNBASED_UNSIZED_LITERAL : '\'0' | '\'1' | '\'' [xXzZ] ;
STRING_LITERAL : '"' ( ~["\\] | ESC_SEQ )*? '"' ;
fragment ESC_SEQ : '\\' . ;
COMMENT : ( ONE_LINE_COMMENT | BLOCK_COMMENT ) -> channel(3) ;
fragment ONE_LINE_COMMENT : '//' COMMENT_TEXT NEWLINE ;
fragment BLOCK_COMMENT : '/*' COMMENT_TEXT '*/' ;
fragment COMMENT_TEXT : ASCII_ANY*? ;
fragment NEWLINE : '\r'? '\n' ;
ESCAPED_IDENTIFIER : '\\' ASCII_PRINTABLE_EXCEPT_SPACE* WHITE_SPACE ;
SIMPLE_IDENTIFIER : [a-zA-Z_] [a-zA-Z0-9_$]* ;
SYSTEM_TF_IDENTIFIER : '$' [a-zA-Z0-9_$][a-zA-Z0-9_$]* ;
WHITE_SPACE : [ \t\r\n]+ -> channel(1) ;
fragment ASCII_ANY : [\u0000-\uffff] ;
fragment ASCII_PRINTABLE : [\u0020-\u007e] ;
fragment ASCII_PRINTABLE_EXCEPT_SPACE : [\u0021-\u007e] ;

INCLUDE_DIRECTIVE : '`include' -> channel(2) ;
DEFINE_DIRECTIVE : '`define' -> channel(2), mode(DEFINE_DIRECTIVE_MODE) ;
UNDEF_DIRECTIVE : '`undef' -> channel(2) ;
UNDEFINEALL_DIRECTIVE : '`undefineall' -> channel(2) ;
IFDEF_DIRECTIVE : '`ifdef' -> channel(2) ;
IFNDEF_DIRECTIVE : '`ifndef' -> channel(2) ;
ELSIF_DIRECTIVE : '`elsif' -> channel(2) ;
ELSE_DIRECTIVE : '`else' -> channel(2) ;
ENDIF_DIRECTIVE : '`endif' -> channel(2) ;
BEGIN_KEYWORDS_DIRECTIVE : '`begin_keywords' -> channel(2), mode(IGNORE_MODE) ;
END_KEYWORDS_DIRECTIVE : '`end_keywords' -> channel(2), mode(IGNORE_MODE) ;
CELLDEFINE_DIRECTIVE : '`celldefine' -> channel(2), mode(IGNORE_MODE) ;
ENDCELLDEFINE_DIRECTIVE : '`endcelldefine' -> channel(2), mode(IGNORE_MODE) ;
DEFAULT_NETTYPE_DIRECTIVE : '`default_nettype' -> channel(2), mode(IGNORE_MODE) ;
LINE_DIRECTIVE : '`line' -> channel(2), mode(IGNORE_MODE) ;
PRAGMA_DIRECTIVE : '`pragma' -> channel(2), mode(IGNORE_MODE) ;
RESETALL_DIRECTIVE : '`resetall' -> channel(2), mode(IGNORE_MODE) ;
TIMESCALE_DIRECTIVE : '`timescale' -> channel(2), mode(IGNORE_MODE) ;
NOUNCONNECTED_DRIVE_DIRECTIVE : '`nounconnected_drive' -> channel(2), mode(IGNORE_MODE) ;
UNCONNECTED_DRIVE_DIRECTIVE : '`unconnected_drive' -> channel(2), mode(IGNORE_MODE) ;
FILE_DIRECTIVE : '`__FILE__' -> channel(2), mode(IGNORE_MODE) ;
LINE_DIRECTIVE_ : '`__LINE__' -> channel(2), mode(IGNORE_MODE) ;

MACRO_USAGE : '`' [a-zA-Z_] [a-zA-Z0-9_$]* -> channel(2) ;

mode IGNORE_MODE;
DIRECTIVE_TEXT : COMMENT_TEXT NEWLINE -> channel(2), mode(DEFAULT_MODE) ;

mode DEFINE_DIRECTIVE_MODE;
DIRECTIVE_COMMENT : COMMENT -> channel(1) ;
DIRECTIVE_WHITE_SPACE : [ \t]+ -> channel(1) ;
DIRECTIVE_NEWLINE : NEWLINE -> channel(1) ;
DIRECTIVE_IDENTIFIER : [a-zA-Z_] [a-zA-Z0-9_$]* -> channel(2), mode(MACRO_TEXT_MODE) ;

mode MACRO_TEXT_MODE;
MACRO_WHITE_SPACE: [ \t]+ -> channel(2) ;
MACRO_TEXT : ~[ \t\r\n\\]+ -> channel(2) ;
MACRO_ESC_NEWLINE : '\\' NEWLINE -> channel(2) ;
MACRO_ESC_SEQ : ESC_SEQ -> channel(2) ;
MACRO_NEWLINE : NEWLINE -> channel(2), mode(DEFAULT_MODE) ;
